home *** CD-ROM | disk | FTP | other *** search
/ C/C++ Users Group Library 1996 July / C-C++ Users Group Library July 1996.iso / listings / v_12_09 / rosen / soundex.c < prev   
Text File  |  1993-12-14  |  2KB  |  88 lines

  1. /* soundex.c                             */
  2. /* Program to demonstrate use of Soundex */
  3. /* Jeff Rosen, 12/93                     */
  4.  
  5. #include <stdio.h>
  6. #include <ctype.h>
  7.  
  8. #define MODIFIED_VERSION  /* remove for original    */
  9.  
  10. #define MAX_LENGTH    20  /* max # of char to check */
  11. #define SOUNDEX_LENGTH 4  /* length of Soundex code */
  12.  
  13.                   /* ALPHA_OFFSET is decimal value 
  14.            of character 'A' in ASCII character set. */
  15. #define ALPHA_OFFSET    65
  16.  
  17. int main(int argc, char *argv[])
  18. {
  19.     char code[SOUNDEX_LENGTH+1];
  20.  
  21.     soundex(argv[1], code);
  22.     printf("the code is %s \n", code);
  23.     
  24.     return(0);
  25. }
  26.  
  27. int soundex(char *in_name, char *code)
  28. {
  29.        /* ctable contains the Soundex value of each
  30.           letter in alphabetical order. 0 represents 
  31.           letters which are to be ignored */
  32.  
  33.    static char ctable[]  =
  34.        {"01230120022455012623010202"};
  35.  
  36.   char name[MAX_LENGTH+1];
  37.   char prior = ' ', c;
  38.   short i, y=0;
  39.  
  40.                    /* convert name to all upper case */
  41.   for(i=0; in_name[i] && i < MAX_LENGTH; i++)
  42.     name[i] = toupper(in_name[i]);
  43.   name[i] = '\0';
  44.  
  45.            /* generate 1st character of Soundex code */
  46.   code[0] = name[0];
  47.   y=1;
  48.   code[y] = '\0';
  49.  
  50. #ifdef MODIFIED_VERSION
  51.   if (name[0] == 'K')              /* modifications */
  52.     code[0] = 'C';
  53.   else if (name[0] == 'P' && name[1] == 'H')
  54.     code[0] = 'F';
  55. #endif
  56.   
  57.  
  58.   /* loop through rest of name, until code complete */
  59.   for(i=1; name[i]; i++) {
  60.  
  61.     if (! isalpha(name[i]))      /* skip non alpha */
  62.       continue;
  63.  
  64.                        /* skip successive occurance */
  65.     if (name[i] == prior)  
  66.       continue;
  67.     prior = name[i];
  68.  
  69.                           /* lookup letter in table*/
  70.     c = name[i] - ALPHA_OFFSET;
  71.  
  72.     if (ctable[c] == '0')    /* ignore this letter */
  73.       continue;    
  74.  
  75.     code[y++] = ctable[c];          /* add to code */
  76.     code[y] = '\0';
  77.  
  78.     if (strlen(code) >= SOUNDEX_LENGTH)
  79.       break;                   /* code is complete */
  80.   }
  81.   while (strlen(code) < SOUNDEX_LENGTH) {
  82.     code[y++] = '0';        /* pad code with zeros */
  83.     code[y] = '\0';
  84.   }
  85.  
  86.   return(0);
  87. }
  88.